1.前言
2.Flutter x Dart 學習(延續昨日)
今天將延續昨天鐵人賽文章 D16-Flutter x Dart視覺化魔法,攝護腺量表走勢圖_part3 繼續對 Score_History_Chart_Page.dart
這個檔案做說明,期望透過對這些問題的理解,能對Flutter框架和Dart語言有更多的了解囉! (完整程式碼請參照: D15-Flutter x Dart視覺化魔法,攝護腺量表走勢圖_part2)
class _ScoreHistoryChartPageState extends State<ScoreHistoryChartPage> {}
class _ScoreHistoryChartPageState extends State<ScoreHistoryChartPage> {...}
Ans: 在 Flutter 中,使用 extends State 表示 _ScoreHistoryChartPageState 這個內部狀態類別是繼承自 State 的。這種繼承關係表示 _ScoreHistoryChartPageState 將繼承 State 類別提供的功能,並且與 ScoreHistoryChartPage widget 相關聯。
具體來說,繼承自 State 的 _ScoreHistoryChartPageState 類別可以使用 widget 屬性來訪問其父級 ScoreHistoryChartPage widget 的屬性和方法,包括 data 和 dates 這些成員變數。這樣可以在內部狀態中使用這些配置參數,以及在 build 方法中訪問它們來構建 UI。
late
和final
的差別為何?late List<FlSpot> _data;
late List<String> _date;
@override
void initState() {
super.initState();
// 初始化 _data
_date = widget.dates; // widget.dates.reversed.toList()
_data = List<FlSpot>.generate(widget.data.length, (index) {
return FlSpot(index.toDouble(), widget.data[widget.data.length - 1 - index].y);
});
}
Ans: 在 Dart 語言中,late 和 final 都是用於變量宣告的修飾子(modifier),但它們有不同的用途和特性:
(1)final
(2)late
總結
final 用於宣告只能被賦值一次的變量。
late 用於宣告將在未來某個時刻被初始化的變量。
在我們的程式碼中,late 被用於 _data 和 _date 變量,表示這兩個變量將在未來某個時刻(例如在 initState 方法中)被初始化。
generate
的定義與用法為何?void initState() {
super.initState();
// 這邊進行反轉數據是沒有用的,因為這邊是初始化,正式更新在下方,請搜尋下方: .reversed.toList()
// 初始化 _data
_date = widget.dates; // widget.dates.reversed.toList()
_data = List<FlSpot>.generate(widget.data.length, (index) {
return FlSpot(index.toDouble(), widget.data[widget.data.length - 1 - index].y);
});
}
Ans: generate
是 List
類的一個靜態工廠方法(static factory method),用於生成一個固定長度的列表。它需要兩個參數:
length
:要生成的列表的長度。generator
:一個函數,它接受當前索引作為參數,並返回該索引對應的元素值。static List<E> generate<E>(
int length,
E generator(int index)
)
var list = List<int>.generate(5, (index) => index * index);
print(list); // 輸出: [0, 1, 4, 9, 16]
在我們的程式碼中,generate 被用來創建一個新的 FlSpot 列表,其長度與 widget.data 相同。對於每個索引,它返回一個新的 FlSpot 對象,其 x 值為當前索引,y 值為 widget.data 中對應位置的 y 值。
widget.data.where
的詳細用法?List<FlSpot> filteredData = widget.data.where((spot) {
// 使用 widget.dates 從 spot 的 x 座標獲取日期並解析為 DateTime
DateTime spotDate = DateTime.parse(widget.dates[spot.x.toInt()]);
// 此條件: 確保數據點的日期在選擇的日期範圍內。如果符合這個條件,則該數據點被保留
return spotDate.isAfter(startDate) && spotDate.isBefore(endDate.add(Duration(days: 1)));
}).toList();
Ans: 在 Dart 中,where 是 Iterable 類的一個方法,用於過濾集合中的元素。它返回一個新的延遲計算的 Iterable,其中只包含滿足給定的條件的元素。
在我們的程式碼中,widget.data 是一個 List,因此它也是一個 Iterable。where 方法接受一個回調函數,該函數對每個元素進行評估,並返回一個布林值(Boolean)。如果回調函數返回 true,則該元素將被包含在新的 Iterable 中;如果返回 false,則該元素將被排除。
DateTime spotDate = DateTime.parse(widget.dates[spot.x.toInt()]);
的詳細用法?Ans: 這段程式碼的主要目的是從 widget.dates
列表中獲取一個日期字符串,並將其解析為 DateTime
對象。以下是逐步分析:
總結: 這段程式碼的目的是將 FlSpot
對象的 x
屬性值作為索引,從 widget.dates
列表中獲取一個日期字符串,然後將該字符串解析為 DateTime
對象,並將其存儲在 spotDate
變量中。
Sometimes you need to be alone. Not to be lonely, but to enjoy your free time being yourself✨
有時你必須學會獨處,並不表示孤單,而是去享受做自己的時間✨